import wepy from 'wepy'

export default class baseMixin extends wepy.mixin {
  /**
   * [公共方法]
   * @param  {[type]}  item [description]
   * @return {Boolean}      [description]
   */
  noop() {
    return null;
  }
  hasOwn(obj, type) {
    return Object.prototype.hasOwnProperty.call(obj, type);
  }

  /**
   * [isXXX 基础方法]
   * @param  {[type]}  item [description]
   * @return {Boolean}      [description]
   */
  isUndefined(item) {
    return typeof item === 'undefined';
  }
  isDefined(item) {
    return !this.isUndefined(item);
  }
  isString(item) {
    return typeof item === 'string';
  }
  isNumber(item) {
    return typeof item === 'number';
  }
  isArray(item) {
    return Object.prototype.toString.apply(item) === '[object Array]';
  }
  isObject(item) {
    return typeof item === 'object' && !this.isArray(item);
  }
  isFunction(item) {
    return typeof item === 'function';
  }

  /**
   * [getXXX 增强方法]
   * @param  {[type]}  item [description]
   * @return {Boolean}      [description]
   */
  getString(item, defaultStr) {
    if (this.isString(item)) return item.trim();
    if (this.isNumber(item)) return `${item}`.trim();
    return defaultStr || '';
  }
  getNumber(item, defaultNum) {
    var matches = this.getString(item).match(/\d+/);
    return this.isNumber(matches && +matches[0]) ? +matches[0] : defaultNum;
  }
  getArray(item, defaultArr) {
    return this.isArray(item) ? item : (defaultArr || []);
  }
  getObject(item, defaultObj) {
    return this.isObject(item) ? item : (defaultObj || {});
  }
  getFunction(item) {
    return this.isFunction(item) ? item : noop;
  }

  /**
   * [JSON方法]
   * @param  {[type]}  item [description]
   * @return {Boolean}      [description]
   */
  $json(item) {
    let str = {type: Object.prototype.toString.call(item)}
    try {
      str = JSON.stringify(item)
    } catch (e) {
      str.error = e && e.stack || ''
    }
    return this.isString(str) ? str : this.$json(str)
  }
  $parse(item) {
    let obj = {type: Object.prototype.toString.call(item)}
    try {
      obj = JSON.parse(item)
    } catch (e) {
      obj.error = e && e.stack || ''
    }
    return this.isObject(obj) ? obj : this.$parse(obj)
  }

  /**
   * [功能方法]
   * @param  {[type]}  item [description]
   * @return {Boolean}      [description]
   */
  isPhone(str) {
    return /^1\d{10}$/.test(str)
  }
  $alert(item = '提示', item2, cancel = false) {
    const param = this.isObject(item) ? Object.assign({
      // 首参数为obj
      title: 'title', content: 'content'
    }, item) : this.isString(item) ? this.isString(item2) ? {
      // 俩参数均为字符串
      title: item, content: item2
    } : {
      // 只有首参为字符串
      title: '', content: item
    } : {
      // 尝试转换字符串
      title: item.toString ? item.toString() : '参数异常'
    }
    wx.showModal(Object.assign({
      showCancel: cancel
    }, param))
  }
  /*
  @param  {[type]}  item [description]
  @param  {[type]}  successFunc [description]
  function(res) {
    if (res.confirm) {
      
    } else if (res.cancel) {
      //do nothing
    }
  }
   */
  $confirm(item = '',successFunc) {
    wx.showModal({
      title: '提示',
      content: item,
      success: successFunc
    })
  }
  /*
    数据操作函数
   */
  getRandom(n,m){    
    let c = m-n+1;      
    return Math.floor(Math.random() * c + n)
  }    
  //编码unicode
  encodeUnicode(str) {  
    let res = [];  
    for (let i=0; i<str.length; i++ ) {  
    res[i] = ( "00" + str.charCodeAt(i).toString(16) ).slice(-4)
    }  
    return "\\u" + res.join("\\u")
  }  
  //解码  
  decodeUnicode(str) {  
    str = str.replace(/\\/g, "%")
    return unescape(str)
  }  
  //数组去重，@return arary
  unique(arr){
   // 遍历arr，把元素分别放入tmp数组(不存在才放)
   let tmp = new Array();
   for(let i in arr){
      //该元素在tmp内部不存在才允许追加
      if(tmp.indexOf(arr[i])==-1){
        tmp.push(arr[i])
      }
   }
   return tmp;
  }
  //设置隐藏微信的loading
  setHideWXLoading(){
    this.$root.$parent.globalData.hideWXLoading = true
    setTimeout(()=>{
      this.$root.$parent.globalData.hideWXLoading = false
      this.$apply()
    },100)
  }
}
